@@ -205,3 +205,68 @@ def test_mixed_revisions_user_deletion(self):
205
205
206
206
rev2 = Revision .objects .filter (id = rev2_id ).first ()
207
207
self .assertIsNone (rev2 , "Deleted user's revision should be deleted" )
208
+
209
+ def test_revision_based_on_deletion (self ):
210
+ """
211
+ Test the handling of a revision's "based_on" field when it references a revision
212
+ created by a user that is deleted.
213
+ """
214
+ doc = DocumentFactory ()
215
+ rev1 = RevisionFactory (document = doc , creator = self .user )
216
+ rev2 = RevisionFactory (document = doc , based_on = rev1 )
217
+ rev3 = ApprovedRevisionFactory (document = doc , based_on = rev2 )
218
+
219
+ doc_id = doc .id
220
+ rev1_id = rev1 .id
221
+ rev2_id = rev2 .id
222
+ rev3_id = rev3 .id
223
+
224
+ self .listener .on_user_deletion (self .user )
225
+
226
+ self .assertTrue (
227
+ Document .objects .filter (id = doc_id ).exists (), "Document should not be deleted"
228
+ )
229
+ self .assertFalse (
230
+ Revision .objects .filter (id = rev1_id ).exists (),
231
+ "Deleted user's unapproved revision should be deleted" ,
232
+ )
233
+ rev2 = Revision .objects .filter (id = rev2_id ).first ()
234
+ self .assertIsNotNone (rev2 , "Other user's revision should not be deleted" )
235
+ self .assertIsNone (rev2 .based_on , "Other user's revision's based_on should now be None" )
236
+ rev3 = Revision .objects .filter (id = rev3_id ).first ()
237
+ self .assertIsNotNone (rev3 , "The approved revision should not be deleted" )
238
+ self .assertEqual (rev3 .based_on , rev2 )
239
+
240
+ it_doc = DocumentFactory (locale = "it" , parent = doc )
241
+ it_rev = RevisionFactory (document = it_doc , based_on = rev2 )
242
+
243
+ it_doc_id = it_doc .id
244
+ it_rev_id = it_rev .id
245
+
246
+ self .listener .on_user_deletion (rev2 .creator )
247
+
248
+ # Ensure that the default document wasn't deleted.
249
+ self .assertTrue (
250
+ Document .objects .filter (id = doc_id ).exists (), "Document should not be deleted"
251
+ )
252
+
253
+ # The deleted user's un-approved revision should not have been deleted,
254
+ # but instead re-assigned to the sumo bot, because it's the based-on
255
+ # value of a localized revision.
256
+ rev2 = Revision .objects .filter (id = rev2_id ).first ()
257
+ self .assertIsNotNone (rev2 , "Deleted user's revision should not be deleted" )
258
+ self .assertEqual (rev2 .creator .username , settings .SUMO_BOT_USERNAME )
259
+
260
+ # Ensure that the third revision, whose based-on value is the revision
261
+ # whose creator was deleted, was not affected at all.
262
+ rev3 = Revision .objects .filter (id = rev3_id ).first ()
263
+ self .assertIsNotNone (rev3 , "The approved revision should not be deleted" )
264
+ self .assertEqual (rev3 .based_on , rev2 )
265
+
266
+ self .assertTrue (
267
+ Document .objects .filter (id = it_doc_id ).exists (),
268
+ "The Italian document should not be deleted" ,
269
+ )
270
+ it_rev = Revision .objects .filter (id = it_rev_id ).first ()
271
+ self .assertIsNotNone (it_rev , "The Italian revision should not be deleted" )
272
+ self .assertEqual (it_rev .based_on , rev2 )
0 commit comments